home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Univers Mac Interactif 53
/
Univers Mac Interactif - Issue 53.iso
/
UNIVERS MAC 53
/
Hypercard
/
Sans-Faute⁄Grammaire®
/
Sans-Faute⁄Grammaire ƒ
/
Pour les autres applications
/
4D
/
External SFG pour 4D
/
Sources
/
ExternalSFG.p
< prev
next >
Wrap
Text File
|
1995-09-07
|
11KB
|
395 lines
unit ExternalSFG;
interface
uses
AppleTalk, Processes, PPCToolBox, EPPC, Notification, AppleEvents, AERegistry, Ext4D;
const
CheckDialogID = 16666;
(* renvoie errAEWaitCanceled (-1711) si l'utilisateur a annulé la vérification dans Sans-Faute/Grammaire *)
procedure main (entryPoint: Longint; params: PackagePtr; var data: Handle; var resultmain: longint);
implementation
const
SFGsignature = 'SFGr';
function launchSFG: OSErr;
var
process: ProcessSerialNumber;
InfoRec: ProcessInfoRec;
DeskTopPB: DTPBRec;
volPB: HParamBlockRec;
SFGFound: Boolean;
SFGFSSpec: FSSpec;
err: OSErr;
theLaunchParams: LaunchParamBlockRec;
block: ParameterBlock;
begin
process.highLongOfPSN := 0;
process.lowLongOfPSN := kNoProcess;
InfoRec.processInfoLength := sizeof(ProcessInfoRec);
InfoRec.processName := nil;
InfoRec.processAppSpec := nil;
SFGFound := false;
while not SFGFound & (GetNextProcess(process) = noErr) do
if GetProcessInformation(process, InfoRec) = noErr then
if (InfoRec.processType = longint('APPL')) and (InfoRec.processSignature = SFGsignature) then
SFGFound := true;
if SFGFound then
begin
launchSFG := noErr;
exit(launchSFG);
end;
volPB.ioNamePtr := nil;
volPB.ioVolIndex := 1;
SFGFound := false;
while not SFGFound & (PBHGetVInfo(@volPB, false) = noErr) do
with DeskTopPB do
begin
ioNamePtr := nil;
ioVRefnum := volPB.ioVRefnum;
if PBDTGetPath(@DeskTopPB) = noErr then
begin
ioNamePtr := @SFGFSSpec.name;
ioIndex := 0;
ioFileCreator := SFGsignature;
if PBDTGetAPPL(@DeskTopPB, false) = noErr then
begin
SFGFSSpec.vRefnum := volPB.ioVRefnum;
SFGFSSpec.parID := ioAPPLParID;
SFGFound := true;
end;
end;
volPB.ioVolIndex := volPB.ioVolIndex + 1;
end;
if not SFGFound then
begin
launchSFG := fnfErr;
exit(launchSFG);
end;
with theLaunchParams do
begin
launchBlockID := extendedBlock;
launchEPBLength := extendedBlockLen;
launchFileFlags := 0;
launchControlFlags := launchContinue + launchNoFileFlags;
launchAppSpec := @SFGFSSpec;
launchAppParameters := nil;
end;
Call4D(kEX_RESTORE_MACOS_ENV, block);
err := LaunchApplication(@theLaunchParams);
Call4D(kEX_RESTORE_MAC4D_ENV, block);
if err <> noErr then
begin
launchSFG := err;
exit(launchSFG);
end;
launchSFG := noErr;
end;
procedure PutSFGInFront;
var
process: ProcessSerialNumber;
InfoRec: ProcessInfoRec;
SFGFound: boolean;
err: OSErr;
block: ParameterBlock;
begin
process.highLongOfPSN := 0;
process.lowLongOfPSN := kNoProcess;
InfoRec.processInfoLength := sizeof(ProcessInfoRec);
InfoRec.processName := nil;
InfoRec.processAppSpec := nil;
SFGFound := false;
while not SFGFound & (GetNextProcess(process) = noErr) do
if GetProcessInformation(process, InfoRec) = noErr then
if (InfoRec.processType = longint('APPL')) and (InfoRec.processSignature = SFGsignature) then
begin
SFGFound := true;
Call4D(kEX_RESTORE_MACOS_ENV, block);
err := SetFrontProcess(process);
Call4D(kEX_RESTORE_MAC4D_ENV, block);
end;
end;
procedure MyInitDesc (var desc: AEDesc);
begin
desc.descriptorType := typeNull;
desc.dataHandle := nil;
end;
procedure MyDisposeDesc (var desc: AEDesc);
var
err: OSErr;
begin
if (desc.dataHandle <> nil) then
begin
err := AEDisposeDesc(desc);
desc.dataHandle := nil;
desc.descriptorType := typenull;
end;
end;
type
AEHandlerGlobRec = record
TextToReturn: TextBlock;
checkdoneFlag: boolean;
SFGAevtReturnID: longint;
AEcodeErr: OSErr;
end;
AEHandlerGlobPtr = ^AEHandlerGlobRec;
function SFGAnswerHandler (theAppleEvent: AppleEvent; reply: AppleEvent; HandlerRefCon: longint): OSErr;
var
result: AEDesc;
err: OSErr;
AevtReturnID: longint;
actualSize: Size;
actualTypeCode: DescType;
theAEHandlerGlobPtr: AEHandlerGlobPtr;
begin
theAEHandlerGlobPtr := AEHandlerGlobPtr(HandlerRefCon);
with theAEHandlerGlobPtr^ do
begin
err := AEGetAttributePtr(theAppleEvent, keyReturnIDAttr, typeLongInteger, actualTypeCode, @AevtReturnID, sizeof(longint), actualSize);
if (err = noErr) & (SFGAevtReturnID = AevtReturnID) then
begin
checkdoneFlag := true;
err := AEGetParamPtr(theAppleEvent, keyErrorNumber, typeShortInteger, actualTypeCode, @AEcodeErr, SizeOf(OSErr), actualSize);
if err = NoErr then
begin
if AEcodeErr = noErr then
begin
MyInitDesc(result);
err := AEGetParamDesc(theAppleEvent, keyDirectObject, typeChar, result);
if err = noErr then
begin
SetHandleSize(Handle(TextToReturn.fData), GetHandleSize(result.dataHandle));
BlockMove(result.dataHandle^, Handle(TextToReturn.fData)^, GetHandleSize(result.dataHandle));
TextToReturn.fSize := GetHandleSize(result.dataHandle);
end
else
AEcodeErr := err;
MyDisposeDesc(result);
end
end
else
AEcodeErr := err;
end;
SFGAnswerHandler := noErr;
end;
end;
procedure main (entryPoint: Longint; params: PackagePtr; var data: Handle; var resultmain: longint);
var
checkDialog: DialogPtr;
AEHandlerGlob: AEHandlerGlobRec;
oldPort: GrafPtr;
TextToCheck: TextBlock;
function SendAECheckToSFG: OSErr;
var
err: OSerr;
targetSignature: OSType;
target, directParamDesc, result: AEDesc;
evt, reply: AppleEvent;
tempRect: Rect;
actualTypeCode: DescType;
actualSize: Size;
begin
err := launchSFG;
if err <> noErr then
begin
SendAECheckToSFG := err;
exit(SendAECheckToSFG);
end;
MyInitDesc(evt);
MyInitDesc(reply);
MyInitDesc(directParamDesc);
MyInitDesc(target);
targetSignature := SFGsignature;
err := AECreateDesc(typeApplSignature, @targetSignature, sizeof(targetSignature), target);
if err = noErr then
err := AECreateAppleEvent('WSrv', 'Btch', target, kAutoGenerateReturnID, kAnyTransactionID, evt);
if err = noErr then
err := AEGetAttributePtr(evt, keyReturnIDAttr, typeLongInteger, actualTypeCode, @AEHandlerGlob.SFGAevtReturnID, sizeof(longint), actualSize);
HLock(Handle(TextToCheck.fData));
if err = noErr then
err := AECreateDesc(typeChar, Handle(TextToCheck.fData)^, TextToCheck.fSize, directParamDesc);
HUnlock(Handle(TextToCheck.fData));
if err = noErr then
err := AEPutParamDesc(evt, keyDirectObject, directParamDesc);
if err = noErr then
err := AESend(evt, reply, kAEQueueReply + kAEAlwaysInteract + kAECanSwitchLayer, kAENormalPriority, kNoTimeOut, nil, nil);
MyDisposeDesc(evt);
MyDisposeDesc(reply);
MyDisposeDesc(directParamDesc);
MyDisposeDesc(target);
SendAECheckToSFG := err;
end;
procedure TreatActivateUpdateOSDialogEvent (theEvent: EventRecord);
var
oldPort: GrafPtr;
begin
case theEvent.what of
ActivateEvt, osEvt:
;
updateEvt:
if WindowPtr(theEvent.message) = checkDialog then
begin
BeginUpdate(checkDialog);
GetPort(oldPort);
SetPort(checkDialog);
UpdtDialog(checkDialog, checkDialog^.visRgn);
SetPort(oldPort);
EndUpdate(checkDialog);
end;
end;
end;
procedure EnableDisableMenuBar (Enable: boolean);
var
theMenuBar: CharsHandle;
NumOfMenus, indMenu: integer;
aMenuHandle: MenuHandle;
begin
theMenuBar := CharsHandle(GetMenuBar);
BlockMove(@theMenuBar^^[0], @NumOfMenus, sizeof(integer));
NumOfMenus := NumOfMenus div 6;
for indMenu := 0 to NumOfMenus - 1 do
begin
BlockMove(@theMenuBar^^[6 + indMenu * 6], @aMenuHandle, sizeof(aMenuHandle));
if Enable then
EnableItem(aMenuHandle, 0)
else
DisableItem(aMenuHandle, 0);
end;
DisposHandle(Handle(theMenuBar));
DrawMenuBar;
end;
procedure EndMain;
var
err: OSerr;
begin
err := AERemoveEventHandler(kCoreEventClass, kAEAnswer, @SFGAnswerHandler, false);
EnableDisableMenuBar(true);
DisposeDialog(checkDialog);
SetPort(oldPort);
TextPtr(params^[2])^ := AEHandlerGlob.TextToReturn;
end;
var
whichWindow: WindowPtr;
theEvent: EventRecord;
err: OSerr;
dragRect: Rect;
MousePt: Point;
whichControl: ControlHandle;
ignore: longint;
begin
if entryPoint = 1 then
begin
TextToCheck := TextPtr(params^[1])^;
AEHandlerGlob.TextToReturn.fSize := 0;
if TextPtr(params^[2])^.fData <> nil then
begin
AEHandlerGlob.TextToReturn.fData := TextPtr(params^[2])^.fData;
SetHandleSize(Handle(AEHandlerGlob.TextToReturn.fData), 0);
end
else
AEHandlerGlob.TextToReturn.fData := XHANDLE(NewHandle(0));
with dragRect do
SetRect(dragRect, 4, 24, maxint, maxint);
GetPort(oldPort);
checkDialog := GetNewDialog(CheckDialogID, nil, WindowPtr(-1));
SetPort(checkDialog);
ShowWindow(checkDialog);
AEHandlerGlob.checkdoneFlag := false;
EnableDisableMenuBar(false);
err := AEInstallEventHandler(kCoreEventClass, kAEAnswer, @SFGAnswerHandler, longint(@AEHandlerGlob), false);
err := SendAECheckToSFG;
if err <> noErr then
begin
EndMain;
resultmain := err;
exit(main);
end;
repeat
if WaitNextEvent(everyEvent, theEvent, 30, nil) then
case theEvent.what of
ActivateEvt, UpdateEvt, osEvt:
TreatActivateUpdateOSDialogEvent(theEvent);
kHighLevelEvent:
err := AEProcessAppleEvent(theEvent);
mouseDown:
case FindWindow(theEvent.where, whichWindow) of
inSysWindow:
SystemClick(theEvent, whichWindow);
inDrag:
if whichWindow = checkDialog then
DragWindow(whichWindow, theEvent.where, dragRect);
inMenuBar:
ignore := MenuSelect(theEvent.where);
inContent:
if whichWindow = checkDialog then
begin
MousePt := theEvent.where;
GlobalToLocal(MousePt);
if (FindControl(MousePt, checkDialog, whichControl) = inButton) & (TrackControl(whichControl, MousePt, nil) = inButton) then
PutSFGInFront;
end;
otherwise
SysBeep(1);
end;
end;
until AEHandlerGlob.checkdoneFlag;
EndMain;
resultmain := AEHandlerGlob.AEcodeErr;
end
else
resultmain := noErr;
end;
end.